/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sopra09.lv6659438.logik.eintragAuswaehlen;

import java.util.List;
import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import sopra09.lv6659438.logik.awfUnabhaengigeKomponenten.LoggingInterceptor;

/**
 * Prüft ob in der Datenbank überhaupt ein Antrag vorhanden ist und sucht mit
 * den übergebenen Suchkriterien übereinstimmende Literatureinträge
 * @author TJ
 */
@Stateless
@Interceptors({LoggingInterceptor.class, EintragAuswaehlenInterceptor.class})
public class EintragAuswaehlenALBean implements EintragAuswaehlenALLocal {
    @PersistenceContext
    private EntityManager em;
   
   /**
    * Überprüft, ob überhaupt ein Eintrag in der Datenbanl vorhanden ist.
    * @return true, wenn mindestens ein Eintrag vorhanden ist, sonst false
    */
    public boolean istEintragVorhanden() {
        Long count;

        Query q = em.createQuery("SELECT COUNT(l) FROM Literatureintrag l WHERE l.titel LIKE '%'");
        count = (Long) q.getSingleResult();
        if (count == 0) {
            return false;
        } else {
            return true;
        }            
    }
        /**
         * Sucht anhand der übergebenen Suchkriterien passende Einträge in der Datenbank.
         * @param typ
         * @param titel
         * @param autor
         * @param jahr
         * @return Ergebnisliste mit den gefundenen Literatureinträgen
         */
       public List sucheEintrag(String typ, String titel, String autor, String jahr) {
        String eintragTyp = typ;
        String eintragTitel = titel;
        String eintragAutor = autor;
        String eintragJahr = jahr;

        // trimmen der übergebenen Strings
        eintragTyp =  eintragTyp.trim();
        eintragTitel =  eintragTitel.trim();
        eintragAutor =  eintragAutor.trim();
        eintragJahr =  eintragJahr.trim();

        // ersetzen des * zeichens durch das % zeichen (für die jpql)
         if (eintragTitel.contains("*")){
            eintragTitel = eintragTitel.replace("*","%");

         }
        if (eintragAutor.contains("*")){
            eintragAutor = eintragAutor.replace("*","%");
         }
        if (eintragJahr.contains("*")){
            eintragJahr = eintragJahr.replace("*","%");
         }

        // an suche zeitschrift weiterleiten
        if (eintragTyp.equalsIgnoreCase("zeitschrift")) {
            if (((eintragAutor != null) && (eintragAutor.length() > 0))
                    || ((eintragJahr != null) && (eintragJahr.length() > 0))){
                return null;
            }
            List zeitschriftenListe = sucheZeitschrift(eintragTitel);
            return zeitschriftenListe;
        }
        // an suche buch weiterleiten
        else if ((typ.equalsIgnoreCase("buch"))
                || (((eintragAutor != null)&& (eintragAutor.length() > 0)) && (!typ.equalsIgnoreCase("Zeitschrift")))
                || (((eintragJahr != null) && (eintragJahr.length() > 0)) && (!typ.equalsIgnoreCase("Zeitschrift")))) {
            List buecherListe = sucheBuch(eintragTitel, eintragAutor, eintragJahr);
            return buecherListe;
        }
        else {
            // an suche alle weiterleiten
            List ergebnisListe = sucheAlle(eintragTitel, eintragAutor, eintragJahr);
            return ergebnisListe;
        }
    }

     /**
      * Sucht anhand des Titels nach Zeitschriften
      * @param titel
      * @return Liste mit den gefundenen Zeitschriften
      */
    private List sucheZeitschrift(String titel){
        System.out.println("sucheZeitschrift(...) beginnt");
        String eintragTitel = titel;      

        Query q = em.createNamedQuery("sucheZeitschriften");
        q.setParameter("titel", eintragTitel);
        List zeitschriften = q.getResultList();

        return zeitschriften;
    }

    /**
     * Sucht anhand von titel, autor und jahr nach Büchern.
     * @param titel
     * @param autor
     * @param jahr
     * @return Liste mit den gefundenen Büchern
     */
    private List sucheBuch(String titel, String autor, String jahr){
        System.out.println("sucheBuch(...) beginnt");
        String eintragTitel = titel;
        String eintragAutor = autor;
        String eintragJahr = jahr;

        Query q = em.createNamedQuery("sucheBuecher");
        q.setParameter("titel", eintragTitel);
        q.setParameter("autor", eintragAutor);
        q.setParameter("jahr", eintragJahr);
        List buecher = q.getResultList();

        return buecher;
    }

    /**
     * Sucht anhand von titel, autor und jahr nach Büchern oder anhand des titels
     * nach Literatureinträgen.
     * @param titel
     * @param autor
     * @param jahr
     * @return Liste mit gefundenen Literatureinträgen
     */
    private List sucheAlle(String titel, String autor,String jahr){
        System.out.println("sucheAlle(...) beginnt");
        String eintragTitel = titel;
        String eintragAutor = autor;
        String eintragJahr = jahr;

        // suche nach büchern
        if (((eintragAutor != null) && (eintragAutor.length() > 1))
            || ((eintragJahr != null) && (eintragJahr.length() > 1))) {
            sucheBuch(eintragTitel, eintragAutor,null);
            return null;

        // suche nach literatureinträgen (büchern oder zeitschriften)
        } else {
            Query q = em.createNamedQuery("sucheAlle");
            q.setParameter("titel", eintragTitel);
            List alle  = q.getResultList();

            return alle;
        }        
    }



}
